home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 101 (1989-08-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 101 (1989-08-15)(Ossowski, Stefan)(DE)(PD).adf / DP / DP.c < prev    next >
C/C++ Source or Header  |  1989-04-20  |  9KB  |  375 lines

  1. /*
  2.  * DP - Komfortables Font-Assign
  3.  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4.  * Mit "<---" markierte Stellen evtl. ändern
  5.  *
  6.  * Copyright © 1989  Oo
  7.  * by            o.·°
  8.  * Walter Dörwald ·°·o·.o
  9.  *              O
  10.  */
  11.  
  12. #include <exec/types.h>
  13. #include <exec/memory.h>
  14. #include <intuition/intuition.h>
  15. #include <graphics/text.h>
  16. #include <string.h>
  17. #include <libraries/dos.h>
  18. #include <proto/intuition.h>
  19. #include <proto/graphics.h>
  20. #include <proto/dos.h>
  21. #include <proto/exec.h>
  22.  
  23. /* Kurz für MedResBorder */
  24. #define KASTL(x1,y1,x2,y2) x1,y1,x1,y2,x2,y2,x2,y1,x1-1,y1,x1-1,y2,x2+1,y2,x2+1,y1
  25. #define KASTLSIZE 8
  26.  
  27. /* max. Anzahl der Dir's */
  28. #define MAXDIR 50
  29.  
  30. extern UWORD OpenGad_Image_Data[];
  31.  
  32. struct Window *MyWindow = NULL;
  33. struct IntuiMessage *IMessage;
  34. struct RastPort *RP;
  35.  
  36. ULONG MessageClass;
  37.  
  38. UBYTE  Command[58] = "C:Assign Fonts: SYS:Fonts/";  /* <--- */
  39.  
  40. /* Alles mögliche zum Stringspeichern */
  41. UBYTE Daten[MAXDIR][31];
  42. UBYTE FileBuf[31];
  43.  
  44. struct FileInfoBlock *FIB;
  45.  
  46. BYTE Anzahl;
  47. BYTE Count;
  48.  
  49. /* Jetzt kommt das große StrukturenChaos */
  50.  
  51. struct TextAttr TA_FETT =
  52. {
  53.    (UBYTE *)"topaz.font",TOPAZ_SIXTY,FSF_BOLD,FPF_ROMFONT
  54. };
  55.  
  56. struct TextAttr TA_NORM =
  57. {
  58.    (UBYTE *)"topaz.font",TOPAZ_EIGHTY,FSF_BOLD,FPF_ROMFONT
  59. };
  60.  
  61. SHORT End_Border2_Data [] =
  62. {
  63.    KASTL(-1,-1,37,9)
  64. };
  65.  
  66. struct Border End_Border2 =
  67. {
  68.    0,0,0,31,JAM1,KASTLSIZE,End_Border2_Data,NULL
  69. };
  70.  
  71. SHORT End_Border_Data [] =
  72. {
  73.    KASTL(-5,-3,41,11)
  74. };
  75.  
  76. struct Border End_Border =
  77. {
  78.    0,0,0,31,JAM1,KASTLSIZE,End_Border_Data,&End_Border2
  79. };
  80.  
  81. struct IntuiText GadText[] =
  82. {
  83.    {0,1,JAM1,8,1,&TA_FETT,(UBYTE *)"OK",(struct IntuiText *)NULL},
  84.    {0,1,JAM1,3,1,&TA_FETT,(UBYTE *)"Nix",(struct IntuiText *)NULL}
  85. };
  86.  
  87. struct Image OpenGad_6_Image =
  88. {
  89.    -2,-1,14,10,1,OpenGad_Image_Data,1,0,NULL
  90. };
  91.  
  92. struct Image OpenGad_8_Image =
  93. {
  94.    -2,-1,14,10,1,OpenGad_Image_Data+10,1,0,NULL
  95. };
  96.  
  97. struct Image OpenGad_7_Image;
  98. struct PropInfo OpenGad_7_Info =
  99. {
  100.    AUTOKNOB|FREEVERT|PROPBORDERLESS,0,0,0,0xFFFF,0,0,0,0,0,0
  101. };
  102.  
  103. struct Gadget OpenGad [] =
  104. {
  105.    {NULL,11,14,213,8,GADGHCOMP,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,0,NULL},
  106.    {&OpenGad[0],11,22,213,8,GADGHCOMP,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,1,NULL},
  107.    {&OpenGad[1],11,30,213,8,GADGHCOMP,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,2,NULL},
  108.    {&OpenGad[2],11,38,213,8,GADGHCOMP,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,3,NULL},
  109.    {&OpenGad[3],11,46,213,8,GADGHCOMP,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,4,NULL},
  110.    {&OpenGad[4],11,54,213,8,GADGHCOMP,RELVERIFY,BOOLGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,5,NULL},
  111.    {&OpenGad[5],232,24,10,28,GADGHNONE,GADGIMMEDIATE|RELVERIFY|FOLLOWMOUSE,PROPGADGET|REQGADGET,(APTR)&OpenGad_7_Image,NULL,NULL,0L,(APTR)&OpenGad_7_Info,7,NULL},
  112.    {&OpenGad[6],232,13,10,8,GADGHCOMP|GADGIMAGE,RELVERIFY,BOOLGADGET|REQGADGET,(APTR)&OpenGad_6_Image,NULL,NULL,0L,NULL,6,NULL},
  113.    {&OpenGad[7],232,55,10,8,GADGHCOMP|GADGIMAGE,RELVERIFY,BOOLGADGET|REQGADGET,(APTR)&OpenGad_8_Image,NULL,NULL,0L,NULL,8,NULL},
  114.    {&OpenGad[8],201,68,37,9,GADGHCOMP,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,(APTR)&End_Border,NULL,&GadText[0],0L,NULL,100,NULL},
  115.    {&OpenGad[9],15,68,37,9,GADGHCOMP,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,(APTR)&End_Border,NULL,&GadText[1],0L,NULL,101,NULL}
  116. };
  117.  
  118. SHORT Open_Border2_Data [] =
  119. {
  120.    KASTL(226,12,237,41)
  121. };
  122.  
  123. struct Border Open_Border2 =
  124. {
  125.    0,0,0,31,JAM1,KASTLSIZE,Open_Border2_Data,NULL
  126. };
  127.  
  128. SHORT Open_Border_Data [] =
  129. {
  130.    KASTL(5,1,219,52)
  131. };
  132.  
  133. struct Border Open_Border =
  134. {
  135.    0,0,0,31,JAM1,KASTLSIZE,Open_Border_Data,&Open_Border2
  136. };
  137.  
  138. struct NewWindow MyNewWindow =
  139. {
  140.    226,62,252,85,0,1,GADGETUP|GADGETDOWN,
  141.    WINDOWDRAG|NOCAREREFRESH|SMART_REFRESH|ACTIVATE,
  142.    &OpenGad[10],NULL," Font-Directories ",NULL,NULL,0,0,0,0,WBENCHSCREEN
  143. };
  144.  
  145. /* Brauch ma niat */
  146. void MemCleanup(){}
  147.  
  148. /* Deklarationen */
  149. void FillIn(void);
  150. void SetTx(ULONG,ULONG,UBYTE *,UBYTE);
  151.  
  152. void _main()
  153.  
  154. {
  155.    register struct Lock   *DirLock;
  156.    register UWORD       Gad_ID;
  157.    register BYTE       sel = -1;
  158.    register UBYTE       Changed = 0;
  159.    register WORD Help;
  160.    register UBYTE Merk;
  161.  
  162.  
  163.    if (!(IntuitionBase = (struct IntuitionBase *)
  164.       OpenLibrary("intuition.library",0L)))
  165.    goto Fehler;
  166.  
  167.    if (!(GfxBase = (struct GfxBase *)
  168.       OpenLibrary("graphics.library",0L)))
  169.    goto Fehler;
  170.  
  171.    /* FileInfoSpeicher holen */
  172.    if (!(FIB = (struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR)))
  173.       goto Fehler;
  174.  
  175.    /* Fenster auf */
  176.    if (!(MyWindow = (struct Window *)OpenWindow(&MyNewWindow)))
  177.       goto Fehler;
  178.  
  179.    /* Macht die Sache kürzer */
  180.    RP = MyWindow->RPort;
  181.  
  182.    /* Vorbereitungen */
  183.    SetAPen(RP,1);
  184.    RectFill(RP,5,11,246,81);
  185.    SetAPen(RP,0);
  186.    SetBPen(RP,1);
  187.    SetFont(RP,OpenFont(&TA_NORM));
  188.    Count = 0;
  189.    DrawBorder(RP,&Open_Border,5,11);
  190.    Move(RP,67L,71L);
  191.    Text(RP,"Gewählte Fonts:",15);
  192.    RefreshGList(&OpenGad[10],MyWindow,NULL,5);
  193.  
  194.    /* Fonts-Verzeichnis */
  195.    if (DirLock = (struct Lock *)Lock("SYS:Fonts",ACCESS_READ)) /* <--- */
  196.    {
  197.       if (Examine((BPTR)DirLock,FIB))
  198.       {
  199.      /* Einlesen und merken */
  200.      for (Anzahl = 0;ExNext((BPTR)DirLock,FIB);Anzahl++)
  201.      {
  202.         strcpy(Daten[Anzahl],FIB->fib_FileName);
  203.         /* Bei MAXDIR ist Schluß */
  204.         if (Anzahl == MAXDIR)
  205.            break;
  206.      }
  207.      UnLock((BPTR)DirLock);
  208.      /* PropGad setzen */
  209.      OpenGad_7_Info.VertBody = (Anzahl>6) ? (WORD)((LONG)(MAXBODY*6L)/(LONG)Anzahl) : MAXBODY;
  210.      OpenGad_7_Info.VertPot  = 0;
  211.      /* Ausgeben */
  212.      FillIn();
  213.       }
  214.    }
  215.  
  216.    do
  217.    {
  218.       /* Warten auf Nachricht */
  219.       WaitPort(MyWindow->UserPort);
  220.       while (IMessage = (struct IntuiMessage *)GetMsg(MyWindow->UserPort))
  221.       {
  222.      /* Wichtigstes merken; Nachricht beantworten */
  223.      MessageClass = IMessage->Class;
  224.      Gad_ID = ((struct Gadget *)IMessage->IAddress)->GadgetID;
  225.      ReplyMsg((struct Message *)IMessage);
  226.  
  227.      switch (Gad_ID)
  228.      {
  229.         /* Dir angeklickt */
  230.         case 0:
  231.         case 1:
  232.         case 2:
  233.         case 3:
  234.         case 4:
  235.         case 5:
  236.            if (Gad_ID < Anzahl)
  237.           SetTx(62L,79L,Daten[sel = Count+Gad_ID],16);
  238.            break;
  239.         /* Rauf angeklickt */
  240.         case 6:
  241.            if (Count)
  242.            {
  243.           Count--;
  244.           goto PropEin;
  245.            }
  246.         case 7:
  247.            if ((OpenGad_7_Info.Flags & KNOBHIT) && Anzahl > 6)
  248.            {
  249.           /* Maus verfolgen */
  250.           ModifyIDCMP(MyWindow,MOUSEMOVE|DELTAMOVE|GADGETUP);
  251.           do
  252.           {
  253.              WaitPort(MyWindow->UserPort);
  254.              while ((IMessage = (struct IntuiMessage *)
  255.                GetMsg(MyWindow->UserPort)) &&
  256.                (MessageClass = IMessage->Class) != GADGETUP)
  257.              {
  258.             /* Maus bewegt ? */
  259.             Help = IMessage->MouseY;
  260.             ReplyMsg((struct Message *)IMessage);
  261.             if (!Help)
  262.                continue;
  263.             /* Test ob Bewegung weit genug */
  264.             Merk = Count;
  265.             Count = OpenGad_7_Info.VertPot * (Anzahl-6) / MAXPOT;
  266.             /* Wenn, ja dann neu ausgeben */
  267.             if (Count != Merk)
  268.                FillIn();
  269.              } /* while */
  270.           } /* do */
  271.           while (MessageClass != GADGETUP);
  272.            } /* if */
  273.            /* Maus wieder loslassen */
  274.            ModifyIDCMP(MyWindow,GADGETDOWN|GADGETUP);
  275.            Count = OpenGad_7_Info.VertPot * (Anzahl-6) / MAXPOT;
  276.            FillIn();
  277.            break;
  278.         /* Runter angeklickt */
  279.         case 8:
  280.            if (Count < Anzahl-6)
  281.            {
  282.           Count++;
  283. PropEin:
  284.           OpenGad_7_Info.VertPot = MAXPOT*Count/(Anzahl-6);
  285.           FillIn();
  286.            }
  287.            break;
  288.         /* Ende */
  289.         case 100:
  290.            Changed = 2;
  291.            break;
  292.         default:
  293.            Changed = 1;
  294.            break;
  295.      }
  296.       }
  297.    } while (!Changed);
  298.  
  299.    /* Ende: Aufräumen */
  300.    Fehler:
  301.    if (MyWindow)
  302.       CloseWindow(MyWindow);
  303.    if (FIB)
  304.       FreeMem((UBYTE *)FIB,sizeof(struct FileInfoBlock));
  305.    if (IntuitionBase)
  306.       CloseLibrary((struct Library *)IntuitionBase);
  307.    if (GfxBase)
  308.       CloseLibrary((struct Library *)GfxBase);
  309.  
  310.    /* Ist was zu tun ? */
  311.    if ((Changed == 2) && (sel >= 0))
  312.    {
  313.       register BPTR FH;
  314.       /* Dir anhängen */
  315.       strcpy(Command+26L,Daten[sel]);
  316.       /* CLI auf */
  317.       if (FH = (BPTR)Open("CON:284/99/103/10/ ... ",MODE_NEWFILE))
  318.       {
  319.      /* die nachfolgende Zeile ist der ganze Zweck des Programms */
  320.      Execute(Command,(BPTR)0L,(BPTR)FH);
  321.      Close((BPTR)FH);
  322.       }
  323.    }
  324. }
  325.  
  326.  
  327. void FillIn()
  328.  
  329. {
  330.    register ULONG i,
  331.           Pos;
  332.  
  333.    /* Alle durch */
  334.    for (i = 0;i<6;i++)
  335.    {
  336.       Pos = (ULONG)((i<<3)+20L);
  337.       /* Noch Text da ? */
  338.       if (i<Anzahl)
  339.       {
  340.      /* Text ausgeben */
  341.      SetTx(13,Pos,Daten[Count+i],26);
  342.       }
  343.       else
  344.      /* Leerzeile */
  345.      SetTx(13,Pos,NULL,26);
  346.    }
  347.    /* Neu zeichnen */
  348.    RefreshGadgets(&OpenGad[6],MyWindow,NULL);
  349. }
  350.  
  351. void SetTx(x,y,text,maxlen)
  352.  
  353. ULONG  x,
  354.        y;
  355. UBYTE *text;
  356. UBYTE  maxlen;
  357.  
  358. {
  359.    register UBYTE len = 0;
  360.    /* Text schreiben */
  361.    if (text)
  362.    {
  363.       len = ((len = strlen(text)) > maxlen) ? maxlen : len;
  364.       SetDrMd(RP,JAM2);
  365.       Move(RP,x,y);
  366.       Text(RP,text,len);
  367.    }
  368.    /* Rest löschen */
  369.    SetDrMd(RP,JAM2|INVERSVID);
  370.    RectFill(RP,x+(len<<3),y-6,x+1+(maxlen<<3),y+1);
  371. }
  372.  
  373. /*    //
  374.     \X/   */
  375.